from restaurant import Restaurant
##9-1 餐馆：创建一个名为Restaurant的类，其方法__init__()设置两个属性：restaurant_name和cuisine_type。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法，
##其中前者打印前述两项信息，而后者打印一条消息，指出餐馆正在营业。
##根据这个类创建一个名为restaurant的实例，分别打印其两个属性，再调用前述两个方法。
my_restaurant = Restaurant('居洒屋','海鲜')
my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()

##import restaurant
##my_restaurant = restaurant.Restaurant('居洒屋','海鲜')
##my_restaurant.describe_restaurant()
##my_restaurant.open_restaurant()

print('\n9-2:')
##9-2 三家餐馆：根据你为完成练习9-1而编写的类创建三个实例，并对每个实例调用方法describe_restaurant()。
restaurant01 = Restaurant('居洒屋','海鲜')
restaurant01.describe_restaurant()
restaurant02 = Restaurant('海底捞','火锅')
restaurant02.describe_restaurant()
restaurant03 = Restaurant('味全包子','早饭')
restaurant03.describe_restaurant()

print('\n9-3:')
##9-3 用户：创建一个名为User的类，其中包含属性first_name和last_name，还有用户简介通常会存储的其他几个属性。在类User中定义一个名为describe_user()的方法，
##它打印用户信息摘要；再定义一个名为greet_user()的方法，它向用户发出个性化的问候。
##创建多个表示不同用户的实例，并对每个实例都调用上述两个方法。
from user import User
user1 = User('alice','pich', 33, '139@qq.com', 'hefei');
user1.greet_user()
user2 = User('张','三', 32, '138@163.com', '东京');
user2.greet_user()
user3 = User('alice2','pich2', 4, '138@qq.com', 'New York');
user3.greet_user()

print('\n9-4:')
##9-4 就餐人数：在为完成练习9-1而编写的程序中，添加一个名为number_served的属性，并将其默认值设置为0。根据这个类创建一个名为restaurant的实例；
##打印有多少人在这家餐馆就餐过，然后修改这个值并再次打印它。
##添加一个名为set_number_served()的方法，它让你能够设置就餐人数。调用这个方法并向它传递一个值，然后再次打印这个值。
##添加一个名为increment_number_served()的方法，它让你能够将就餐人数递增。调用这个方法并向它传递一个这样的值：你认为这家餐馆每天可能接待的就餐人数。
restaurant04 = Restaurant('居洒屋','海鲜')
restaurant04.describe_restaurant()

# 直接修改就餐人数
restaurant04.number_served = 10
print(f"修改后就餐人数：{restaurant04.number_served}")
restaurant04.set_number_served(25)
restaurant04.increment_number_served(50)
restaurant04.describe_restaurant()

print('\n9-5:')
##9-5 尝试登录次数：在为完成练习9-3而编写的User类中，添加一个名为login_attempts的属性。编写一个名为increment_login_attempts()的方法，它将属性login_attempts的值加1。
##再编写一个名为reset_login_attempts()的方法，它将属性login_attempts的值重置为0。
##根据User类创建一个实例，再调用方法increment_login_attempts()多次。打印属性login_attempts的值，确认它被正确地递增；然后，调用方法reset_login_attempts()，
##并再次打印属性login_attempts的值，确认它被重置为0。
user4 = User('张','三', 32, '138@163.com', '东京');
user4.increment_login_attempts()
user4.increment_login_attempts()
user4.increment_login_attempts()
user4.increment_login_attempts()
print('登陆次数',user4.login_attempts)
user4.reset_login_attempts()
print('登陆次数',user4.login_attempts)

print('\n9-6:')
##9-6 冰淇淋小店：冰淇淋小店是一种特殊的餐馆。编写一个名为IceCreamStand的类，让它继承你为完成练习9-1或练习9-4而编写的Restaurant类。这两个版本的Restaurant类都可以，
##挑选你更喜欢的那个即可。添加一个名为flavors的属性，用于存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个IceCreamStand实例，并调用这个方法。
from iceCreamStand import IceCreamStand
my_flavors = ['aa','bb', 'cc','dd','ee','ff']
ice01 =  IceCreamStand('夏日冰屋','冰激凌',flavors=my_flavors)
ice01.describe_restaurant()
ice01.show_flavors()

print('\n9-7:')
##9-7 管理员：管理员是一种特殊的用户。编写一个名为Admin的类，让它继承你为完成练习9-3或练习9-5而编写的User类。添加一个名为privileges的属性，
##用于存储一个由字符串（如"can add post"、"can delete post"、"can ban user"等）组成的列表。编写一个名为show_privileges()的方法，它显示管理员的权限。创建一个Admin实例，并调用这个方法。
####from admin import *
####a_privileges = ["can add post","can delete post","can ban user"]
####admin = Admin('elon','musk', 43, 'xelon@gmail.com', '德州',a_privileges)
####admin.show_privileges()

print('\n9-8:')
##9-8 权限：编写一个名为Privileges的类，它只有一个属性——privileges，其中存储了练习9-7所说的字符串列表。将方法show_privileges()移到这个类中。在Admin类中，
##将一个Privileges实例用作其属性。创建一个Admin实例，并使用方法show_privileges()来显示其权限。
from admin import *
a_privileges = ["can add post","can delete post","can ban user"]
admin = Admin('elon','musk', 43, 'xelon@gmail.com', '德州', a_privileges)
admin.privileges.show_privileges()

print('\n9-9:')
##9-9 电瓶升级：在本节最后一个electric_car.py版本中，给Battery类添加一个名为upgrade_battery()的方法。这个方法检查电瓶容量，如果它不是85，就将它设置为85。
##创建一辆电瓶容量为默认值的电动汽车，调用方法get_range()，然后对电瓶进行升级，并再次调用get_range()。你会看到这辆汽车的续航里程增加了。
from electric_car import *
my_tesla = ElectricCar('tesla', 'model s', 2019)
my_tesla.battery.get_range()
my_tesla.battery.upgrade_battery()
my_tesla.battery.get_range()

print('\n9-10:')
##9-10 导入Restaurant类：将最新的Restaurant类存储在一个模块中。在另一个文件中，导入Restaurant类，创建一个Restaurant实例，并调用Restaurant的一个方法，以确认import语句正确无误。
from restaurant import Restaurant
res = Restaurant('蓉合妈妈菜','家常菜')
res.describe_restaurant()

print('\n9-11:')
##9-11 导入Admin类：以为完成练习9-8而做的工作为基础，将User、Privileges和Admin类存储在一个模块中，再创建一个文件，在其中创建一个Admin实例并对其调用方法show_privileges()，以确认一切都能正确地运行。

print('\n9-12:')
##9-12 多个模块：将User类存储在一个模块中，并将Privileges和Admin类存储在另一个模块中。再创建一个文件，在其中创建一个Admin实例，并对其调用方法show_privileges()，以确认一切都依然能够正确地运行。
from user import User
from privileges import Privileges
pri = ['can remove','can ban'];
ad = Admin('Elon','Musk',43,'x@gmail.com','DX', pri)
ad.privileges.show_privileges();

print('\n9-12:')
##9-13 使用OrderedDict：在练习6-4中，你使用了一个标准字典来表示词汇表。请使用OrderedDict类来重写这个程序，并确认输出的顺序与你在字典中添加键—值对的顺序一致。
from collections import OrderedDict
learn_keywords = OrderedDict()
learn_keywords['def'] = '定义函数'
learn_keywords['int'] = '数值类型'
learn_keywords['str'] = '转成string方法'
learn_keywords['if'] = '条件判断'
learn_keywords['for'] = '循环关键字'
learn_keywords['列表'] = 'Python中的有序集合，可以存储多个不同类型的元素，用方括号表示'
learn_keywords['元组'] = '类似于列表的有序集合，但元素不可修改，用圆括号表示'
learn_keywords['模块'] = '包含函数和变量定义的文件，可以通过import语句导入使用'
learn_keywords['类'] = '面向对象编程中的蓝图，用于创建具有相同属性和方法的对象'
learn_keywords['注释'] = '代码中不会被执行的文本，用于解释代码功能，提高可读性'

for key,des in learn_keywords.items():
    print(key,'-',des)

##9-14 骰子：模块random包含以各种方式生成随机数的函数，其中的randint()返回一个位于指定范围内的整数，例如，下面的代码返回一个1～6内的整数：
##from random import randint x = randint(1,6)
##请创建一个Die类，它包含一个名为sides的属性，该属性的默认值为6。编写一个名为roll_die()的方法，它打印位于1和骰子面数之间的随机数。创建一个6面的骰子，再掷10次。
##创建一个10面的骰子和一个20面的骰子，并将它们都掷10次。
from die import Die
die = Die();
for i in range(1,11):
    print(f'第{i}次结果：',die.roll_die())
print('\n')
die = Die(10);
for i in range(1,21):
    print(f'第{i}次结果：',die.roll_die())

    
##9-15 Python Module of the Week：要了解Python标准库，一个很不错的资源是网站Python Module of the Week。请访问http://pymotw.com/并查看其中的目录，
##在其中找一个你感兴趣的模块进行探索，或阅读模块collections和random的文档。

























